#ifndef GRAMMAR_H
#define GRAMMAR_H

#include <vector>
#include <string>
#include "types.h"

/* Клас Rules - це NT-символ граматики з усіма його правилами. Сукупність структур Rules утворює грамматику */

class Rules
{
    std::string nt; // назва NT-символа
    std::vector<std::string> rules; // правила для даного NT-символа
    int number_id; // порядковий номер NT-символа
    bool repeat_itself; // якщо флаг встановлений, то при виводі з даного NT-символа правила, за виведеним правилом потрібно
                       // повторити даний NT-символ. Особливість побудови дерева операцій. Використовується для запобігання неправильної
                      // генерації коду при вкладених циклах та умовних операторах
public:
    Rules();
    Rules(std::string, int);
    Rules(int);
    uint size() const { return rules.size(); } // показує кількість правил, які має даний NT-символ
    std::string getRule (int p) const { return rules[p]; } // повертає правило з номером p для даного NT-символа
    void modifyRule (char r) { rules.back () += r; } // редагує останнє правило для даного NT-символа
    void modifyRule(int n_r, int first, int number) // видаляє з правила n_r number символів починаючи з символа first
    {
        rules[n_r].erase(first, number);
    }
    void pushRule() { rules.push_back(""); }
    void pushRule(std::string r) { rules.push_back(r); }
    void setNTSymbol(char s) { nt += s; }
    void setNTSymbol(std::string s) { nt = s; }
    void setNumberId(int n) { number_id = n; }
    void setRepeatItself(bool r) { repeat_itself = r; }
    int getNumberId() const { return number_id; }
    std::string getNTSymbol() const { return nt; }
    void clear() { rules.clear(); }
    int ruleSymbolCounter(int n) const; // повертає для вказаного правила кількість VT та VN-символів розміщених в даному правилі
    bool isRepeatItself() const { return repeat_itself; }
};

#endif // GRAMMAR_H
